#include <linux/init.h>  	//初始化头文件
#include <linux/module.h>  //最基本的文件，支持动态添加和卸载模块。
#include <linux/of.h>		//添加头文件
int size;					//定义长度
u32 out_values[10] = {0};
const char *str;
struct device_node *beep_device_node; //定义结构体表示我们的节点
struct property *beep_node_property;  //定义结构体表示我们的节点属性

static int hello_init(void)
{
	int ret;
    int i = 0;
	printk("hello world! \n");
	/**********添加我们要查找的节点的代码*******************************/
	// of_find_node_by_path函数通过路径查找节点
	beep_device_node = of_find_node_by_path("/beep");
	if (beep_device_node == NULL)
	{
		//判断是否查找节点成功
		printk("of_find_node_by_path is error \n");
		return -1;
	}
	//打印节点的名字
	printk("beep_device_node name is %s\n", beep_device_node->name);
	/**********获取compatible属性内容的代码****************************/
	// of_find_property函数查找节点属性
	beep_node_property = of_find_property(beep_device_node, "compatible", &size);
	if (beep_node_property == NULL)
	{
		//判断是否查找到节点属性内容
		printk("beep_node_property is error \n");
		return -1;
	}
	//打印属性compatible的名字
	printk("beep_node_property name is %s\n", beep_node_property->name);
	//打印属性compatible的值
	printk("beep_node_property value is %s\n", (char *)beep_node_property->value);
	/**********获取reg属性内容的代码**********************************/
	ret = of_property_read_u32_array(beep_device_node, "reg", out_values, 10);
	if (ret < 0)
	{
		//打印获取失败
		printk("of_property_read_u32_array is error  \n"); 
		return -1;
	}
	// printk("out_values[0] is 0x%8x\n", out_values[0]);
	// printk("out_values[1] is 0x%8x\n", out_values[1]);
    // printk("out_values[2] is 0x%8x\n", out_values[2]);
	// printk("out_values[3] is 0x%8x\n", out_values[3]);
    // printk("out_values[4] is 0x%8x\n", out_values[4]);
	// printk("out_values[5] is 0x%8x\n", out_values[5]);
    // printk("out_values[6] is 0x%8x\n", out_values[6]);
	// printk("out_values[7] is 0x%8x\n", out_values[7]);
    // printk("out_values[8] is 0x%8x\n", out_values[8]);
	// printk("out_values[9] is 0x%8x\n", out_values[9]);

    for (i = 0; i < 10; i++) {
    if (i % 2 != 0) { // 当 i 为奇数时，不换行
        printk("out_values[%d] is 0x%08x\t", i, out_values[i]);
    } else { // 当 i 为偶数时，换行并打印
        printk("out_values[%d] is 0x%08x\n", i, out_values[i]);
    }
}
    printk("\n");
	/**********获取status属性内容的代码*********************************/
	/*读取string 类型值*/
	ret = of_property_read_string(beep_device_node, "status", &str); 
	if (ret < 0)
	{
		//打印获取失败
		printk("of_property_read_string is error  \n"); 
		return -1;
	}
	//打印status属性
	printk("status is %s \n", str);
	return 0;
}
static void hello_exit(void)
{
	printk("gooodbye! \n");
} 
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");